module gary_sync_cell#(
	parameter WIDTH = 8,
	parameter SYNC_CYC = 3
)(
	input in_clk,
	input in_rst_n,
	input out_clk,
	input out_rst_n,
	input [WIDTH -1:0] in_data,
	output[WIDTH -1:0] out_data
);

//将输入转为格雷码并在源时钟域打一拍
wire [WIDTH -1:0]in_data_gray;
wire [WIDTH -1:0]in_data_gray_ff;
b2g_conv #(
	.SIZE(WIDTH))
u_b2g_conv(
	.binary(in_data),
	.gray(in_data_gray)	
);

dffr#(
	.WIDTH(WIDTH))
u_in_data_dffr(
	.clk(in_clk),
	.rst_n(in_rst_n),
	.d(in_data_gray),
	.q(in_data_gray_ff)
);

//将格雷码在目的时钟域打三拍跨异步
wire [WIDTH -1:0]out_data_gray;
genvar i;
generate
    for(i=0; i<WIDTH; i=i+1)begin: inst_rtl
        sync_cell #(
	        .SYNC_CYC(SYNC_CYC))
        u_sync_cell(
	        .clk(out_clk),
	        .rst_n(out_rst_n),
	        .in(in_data_gray_ff[i]),
	        .out(out_data_gray[i])
        );
    end
endgenerate

//将格雷码转化为二进制
g2b_conv #(
	.SIZE(WIDTH))
u_g2b_conv(
	.gray(out_data_gray),
    .binary(out_data)
);

endmodule
